/**
 * Implementaci�n de un fromulario abstracto que predefine eventos que la mayor�a de formularios deben cumplir.<br> Funciona
 * como una Interfaz para ser encapsulado por un Extmx.WindowForm, quien controla los eventos definidos por este formulario
 * @class Extmx.FormPanel
 * Ventana preconfigurada para encapsular un formulario, con botones de aceptar y cancelar, barra de estado para mostrar mensajes
 * 
 * @extends Ext.FormPanel
 * @autor Ing. Josu� Hern�ndez G�mez<br>
 *        joshua@extjs.mx<br>
 *        http://www.joshua.com.mx
 * @fecha 22 de octubre 2010. Oaxaca, M&eacute;xico
 * 
 */
Ext.ns("Extmx.FormPanel");
Extmx.FormPanel=Ext.extend(Ext.FormPanel,{

    /**
     * @cfg {Boolean} frame Por defecto en true.
     */
    frame:true,
    border: false,
	
	/**
    * @cfg {Function} submit M&eacute;do abstracto que obligatoriamente debe ser implementado por quien herede de esta clase. 
	* Debe implementar el procedimiento para tomar los datos del formulario y enviarlos al servidor. Al terminar, debe de lanzar
	* manualmente el evento "agregado". Ejemplo de uso:
	* <pre><code>
	
	submit: function (){
		this.getForm().submit({
            url: URL,
            params: PARAMETROS_EXTRAS,
			scope:this,
			
            success: function(form, action) {
               this.fireEvent("agregado",this);//al finalizar, lanzar el evento "agregado"
               this.reset();
            },
            
            failure: function(form, action) {
                var _res=Ext.decode(action.response.responseText);
                this.fireEvent("error",this,_res.error);//en caso de error, lanzar el posible mensaje del servidor
            }
        }) ;
	}
	* </code></pre>
    */
	submit: function (){
        this.getForm().submit({
            url: this.url,
            scope: this,
            success: this.successFn
        });
    },

    successFn: Ext.emptyFn,
	
	/**
    * @cfg {Function} cargar M&eacute;do abstracto que obligatoriamente debe ser implementado por quien herede de esta clase. 
	* Debe implementar el procedimiento para recuperar datos del servidor y setear los campos que de el dependan. Al terminar de cargar, 
	* debe de lanzar manualmente el evento "cargado". Ejemplo de uso:
	* <pre><code>
	
	cargar: function (record){//debe recibir el par&aacute;metro cargar
		this.{@link #record}= record;
        this.load({
            url: URL,
            params: PARAMETROS_CARGAR,
            scope: this,
            success: function(form, action){
                this.fireEvent("cargado",this);
            },
            failure: function(form, action) {
                alert('Lo siento, hubo un problema');
                Ext.Msg.alert("Carga fallida", action.result.errorMessage);
            }
       }) ;
    }
	* </code></pre>
    */
	cargar: Ext.emptyFn, 
	
	/**
     * Record que debe pasarse a este formulario por medio del m&eacute;todo {@link #cargar}. Representa los datos que estan siendo cargados en el 
	 * formulario. 
     * @property record
     * @type Extmx.StatusBar
    */
	record: undefined,
	
    initComponent: function (){
        Extmx.FormPanel.superclass.initComponent.apply(this,arguments);
		
		this.addEvents(
		/**
		 * @event invalid
		 * Enlazado con el evento "invalid" de cada componente que encapsula. Cada campo debe de tener el listener "invalid" de la 
		 * siguiente manera:
		 * <pre><code>
			items: {
					fieldLabel: '* Login',
					name: 'txtLoginU',
					allowBlank:false,
					vtype:'nombre',
					listeners:{
						scope:this,
						invalid : this.markInvalids 
					}
				}
		 * </code></pre>
		 * Ejecut&aacute;ndose inmediatamente el m&eacute;todo markInvalids y el evento "invalid"
		 * @param {Extmx.FormPanel} form Este formulario
		 * @param {String} msg Mensaje de error lanzado
		 */
		"invalid",
		
		/**
		 * @event cargado
		 * Similar al evento {@link #agregado}. Se dispara despu&eacute;s de haber cargado datos del servidor a este formulario
		 * @param {Extmx.FormPanel} form Este formulario
		 */
		"cargado",
		
		/**
		 * @event agregado
		 * Disparado despues de realizar la persistencia o guardado de la informaci&oacute;n capturada iniciado por le m&eacute;todo {@link #submit}
		 * @param {Extmx.FormPanel} form Este formulario
		 */
		"agregado",

         /**
		 * @event listo
		 * Despliega un mensaje generico
		 * @param {String} mensaje
		 */
		"listo",
		
		/**
		 * @event error
		 * Se dispara al considerarse alg&uacute;n estado inv&aacute;lido dentro del formuario. Puede lanzarse
		 * manualmente al realizar una validaci&oacute;n remota por ejemplo. 
		 * @param {Extmx.FormPanel} form Este formulario
		 * @param {String} msg Mensaje de error lanzado
		 */
		"error");
    },
	
	markInvalids: function (campo,msg){
		if(Ext.isEmpty(msg)){
			this.fireEvent("invalid",campo);
		}
		else
			this.fireEvent("invalid",campo.fieldLabel+": "+msg);
		
	},
	
	isValid: function (){
		return this.getForm().isValid();
	},
	
	reset: function (){
		this.getForm().reset();
		this.record=undefined;
	},
	
	validate: function (){
		this.isValid();
	}
});